﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Studio7i.CapaDominio;
using System.Data.SqlClient;

namespace Studio7i.CapaPersistencia.DAO
{
    public class SalaDAO : ISalaDAO
    {
        // Dependencias
        ILocalDAO localDAO = new LocalDAO();

        // Métodos CRUD
        public Sala Crear(Sala salaACrear)
        {
            string _Sentencia = @"INSERT INTO Sala_Ensayo (CoSala, NoSala, TxCaracteristicas, QtCapacidad, TxComentario, CoLocal) 
                VALUES(@codigo, @nombre, @caracteristicas, @capacidad, @comentarios, @local)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@nombre", salaACrear.NoSala));
                    _Comando.Parameters.Add(new SqlParameter("@caracteristicas", salaACrear.TxCaracteristicas));
                    _Comando.Parameters.Add(new SqlParameter("@capacidad", salaACrear.QtCapacidad));
                    _Comando.Parameters.Add(new SqlParameter("@local", salaACrear.Local.CoLocal));
                    _Comando.Parameters.Add(new SqlParameter("@comentarios", (salaACrear.TxComentario == null) ? DBNull.Value.ToString() : salaACrear.TxComentario));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }
        public Sala Obtener(int codigo)
        {
            string _Sentencia = @"SELECT CoSala, NoSala, TxCaracteristicas, QtCapacidad, CoLocal, TxComentario 
                FROM Sala_Ensayo WHERE CoSala=@codigo";
            Sala salaCreada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            salaCreada = new Sala();
                            salaCreada.CoSala = (int)_Resultado["CoSala"];
                            salaCreada.NoSala = (string)_Resultado["NoSala"];
                            salaCreada.TxCaracteristicas = (string)_Resultado["TxCaracteristicas"];
                            salaCreada.QtCapacidad = (int)_Resultado["QtCapacidad"];
                            salaCreada.Local = localDAO.Obtener((int)_Resultado["CoLocal"]);
                            salaCreada.TxComentario = (string)_Resultado["TxComentario"];
                        }
                    }
                }
            }
            return salaCreada;
        }
        public Sala Modificar(Sala salaAModificar)
        {
            string _Sentencia = @"UPDATE Sala_Ensayo SET NoSala=@nombre, TxCaracteristicas=@caracteristicas, QtCapacidad=@capacidad, CoLocal=@local, TxComentario=@comentarios 
                WHERE CoSala=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@nombre", salaAModificar.NoSala));
                    _Comando.Parameters.Add(new SqlParameter("@caracteristicas", salaAModificar.TxCaracteristicas));
                    _Comando.Parameters.Add(new SqlParameter("@capacidad", salaAModificar.QtCapacidad));
                    _Comando.Parameters.Add(new SqlParameter("@local", salaAModificar.Local.CoLocal));
                    _Comando.Parameters.Add(new SqlParameter("@comentarios", salaAModificar.TxComentario));
                    _Comando.Parameters.Add(new SqlParameter("@codigo", salaAModificar.CoSala));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(salaAModificar.CoSala);
        }
        public void Eliminar(Sala salaAEliminar)
        {
            string _Sentencia = "DELETE FROM Sala_Ensayo WHERE CoSala=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", salaAEliminar.CoSala));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<Sala> ListarTodos()
        {
            string _Sentencia = @"SELECT CoSala, NoSala, TxCaracteristicas, QtCapacidad, CoLocal, TxComentario FROM Sala_Ensayo";
            ICollection<Sala> salasEncontradas = new List<Sala>();
            Sala salaEncontrada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            salaEncontrada = new Sala();
                            salaEncontrada.CoSala = (int)_Resultado["CoSala"];
                            salaEncontrada.NoSala = (string)_Resultado["NoSala"];
                            salaEncontrada.TxCaracteristicas = (string)_Resultado["TxCaracteristicas"];
                            salaEncontrada.QtCapacidad = (int)_Resultado["QtCapacidad"];
                            salaEncontrada.Local = localDAO.Obtener((int)_Resultado["CoLocal"]);
                            salaEncontrada.TxComentario = (string)_Resultado["TxComentario"];
                            salasEncontradas.Add(salaEncontrada);
                        }
                    }
                }
            }
            return salasEncontradas;
        }
        public ICollection<Sala> ListarXBusqueda(int? codigo, string nombre, string caracteristicas, int? capacidad, Local local, string comentarios)
        {
            string _Sentencia = @"SELECT CoSala, NoSala, TxCaracteristicas, QtCapacidad, CoLocal, TxComentario FROM Sala_Ensayo WHERE 1=1";
            ICollection<Sala> salasEncontradas = new List<Sala>();
            Sala salaEncontrada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand())
                {
                    if (codigo != null)
                    {
                        _Sentencia = _Sentencia + " AND CoSala=@codigo";
                        _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    }
                    if (nombre != null)
                    {
                        _Sentencia = _Sentencia + " AND NoSala LIKE '%'+@nombre+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@nombre", nombre));
                    }
                    if (caracteristicas != null)
                    {
                        _Sentencia = _Sentencia + " AND TxCaracteristicas LIKE '%'+@caracteristicas+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@caracteristicas", caracteristicas));
                    }
                    if (capacidad != null)
                    {
                        _Sentencia = _Sentencia + " AND QtCapacidad=@capacidad";
                        _Comando.Parameters.Add(new SqlParameter("@capacidad", capacidad));
                    }
                    if (local != null)
                    {
                        _Sentencia = _Sentencia + " AND CoLocal=@local";
                        _Comando.Parameters.Add(new SqlParameter("@local", local.CoLocal));
                    }
                    if (comentarios != null)
                    {
                        _Sentencia = _Sentencia + " AND TxComentario LIKE '%'+@comentarios+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@comentarios", comentarios));
                    }
                    _Comando.CommandText = _Sentencia;
                    _Comando.Connection = _Conexion;
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            salaEncontrada = new Sala();
                            salaEncontrada.CoSala = (int)_Resultado["CoSala"];
                            salaEncontrada.NoSala = (string)_Resultado["NoSala"];
                            salaEncontrada.TxCaracteristicas = (string)_Resultado["TxCaracteristicas"];
                            salaEncontrada.QtCapacidad = (int)_Resultado["QtCapacidad"];
                            salaEncontrada.Local = localDAO.Obtener((int)_Resultado["CoLocal"]);
                            salaEncontrada.TxComentario = (string)_Resultado["TxComentario"];
                            salasEncontradas.Add(salaEncontrada);
                        }
                    }
                }
            }
            return salasEncontradas;
        }

        public ICollection<Sala> ListarXFiltroBusquedaSala(string nombreSala, string nombreLocal, string guitarra,string teclado, int? capacidad, string grabacion, string fechaHoraDisponible)
        {
            string _Sentencia = @"SELECT sa.NoSala, lo.TxDireccion, sa.QtCapacidad, ins.NoTipo, se.NoServicio
                                  FROM Sala_Ensayo sa inner join Armado_Sala ra on sa.CoSala=ra.CoSala 
				                        inner join Instrumento ins on ra.CoInstrumento = ins.CoInstrumento
				                        inner join Servicio_Adicional se on ra.CoServicio = se.CoServicio
				                        inner join Local lo on sa.CoLocal = lo.CoLocal
				                        inner join Reserva re on re.CoSala = sa.CoSala
                                  WHERE 1=1";            
            ICollection<Sala> salasEncontradas = new List<Sala>();
            Sala salaEncontrada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand())
                {
                    if (nombreSala != null)
                    {
                        _Sentencia = _Sentencia + " AND sa.NoSala LIKE '%'+@nombreSala+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@nombreSala", nombreSala));
                    }
                    if (nombreLocal != null)
                    {
                        _Sentencia = _Sentencia + " AND lo.NoLocal LIKE '%'+@nombreLocal+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@nombreLocal", nombreLocal));
                    }
                    if (guitarra != null)
                    {
                        _Sentencia = _Sentencia + " AND ins.NoTipo LIKE '%'+@guitarra+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@guitarra", guitarra));
                    }
                    if (teclado != null)
                    {
                        _Sentencia = _Sentencia + " AND ins.NoTipo LIKE '%'+@teclado+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@teclado", teclado));
                    }
                    if (capacidad != null)
                    {
                        _Sentencia = _Sentencia + " AND sa.QtCapacidad=@capacidad";
                        _Comando.Parameters.Add(new SqlParameter("@capacidad", capacidad));
                    }
                    if (grabacion != null)
                    {
                        _Sentencia = _Sentencia + " AND se.NoServicio LIKE '%'+@grabacion+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@grabacion", grabacion));
                    }
                    if (fechaHoraDisponible != null)
                    {
                        _Sentencia = _Sentencia + " AND NOT @fechaHora BETWEEN RE.FeInicio AND RE.FeFinal";
                        _Comando.Parameters.Add(new SqlParameter("@fechaHora", fechaHoraDisponible));
                    }
                    _Comando.CommandText = _Sentencia;
                    _Comando.Connection = _Conexion;
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            salaEncontrada = new Sala();
                            salaEncontrada.CoSala = (int)_Resultado["CoSala"];
                            salaEncontrada.NoSala = (string)_Resultado["NoSala"];
                            salaEncontrada.TxCaracteristicas = (string)_Resultado["TxCaracteristicas"];
                            salaEncontrada.QtCapacidad = (int)_Resultado["QtCapacidad"];
                            salaEncontrada.Local = localDAO.Obtener((int)_Resultado["CoLocal"]);
                            salaEncontrada.TxComentario = (string)_Resultado["TxComentario"];
                            salasEncontradas.Add(salaEncontrada);
                        }
                    }
                }
            }
            return salasEncontradas;
        }

        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(CoSala) FROM Sala_Ensayo";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }

    }
}